www.gusucode.com > VC++ 简易二维平面CAD绘图程序-源码程序 > VC++ 简易二维平面CAD绘图程序-源码程序/code/CAD/CircleTool.cpp

    //Download by http://www.NewXing.com
// CircleTool.cpp: implementation of the CCircleTool class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CircleTool.h"
#include "Circle.h"
#include "WinApp.h"

extern CWinApp g_theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCircleTool::CCircleTool()
{
	
}

CCircleTool::~CCircleTool()
{

}

void CCircleTool::OnMouseMove(HWND hWnd, UINT nFlags, POINT ptPos) 
{
	CDataBase *pDataBase = &(g_theApp.m_DataBase);
	if(m_eToolState == FirstHit)
	{
		HDC  hdc      = ::GetDC(hWnd);
		int  nOldMode = ::SetROP2(hdc,R2_XORPEN);
		HPEN hPen     = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
						             pDataBase->m_Shape.nWidth,
								     pDataBase->m_Shape.crColor^ GetBkColor(hdc) );
		 
		 
		HPEN hOldPen = (HPEN)::SelectObject(hdc,hPen);
		//不进行填充
		::SelectObject(hdc,GetStockObject(NULL_BRUSH));
		
		//擦去前一次线段
		int nRadius = CDraw::Distance(m_ptBeginPos,m_ptPrePos );
		CDraw::DrawCircle(hdc,m_ptBeginPos,nRadius);

		//画出这一次线段
		nRadius = CDraw::Distance(m_ptBeginPos,ptPos );
		CDraw::DrawCircle(hdc,m_ptBeginPos,nRadius);		
					
		::SetROP2(hdc,nOldMode);	
		::SelectObject(hdc,hOldPen);
		::DeleteObject(hPen);		
		::ReleaseDC(hWnd,hdc);
		
		m_ptPrePos = ptPos;
	}
}

void CCircleTool::OnRButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
{
	CDataBase *pDataBase = &(g_theApp.m_DataBase);
	if(m_eToolState == FirstHit)
	{
		HDC  hdc      = ::GetDC(hWnd);
		int  nOldMode = ::SetROP2(hdc,R2_XORPEN);
		HPEN hPen     = ::CreatePen( pDataBase->m_Shape.fnPenStyle,
						             pDataBase->m_Shape.nWidth,
								     pDataBase->m_Shape.crColor^ GetBkColor(hdc) );

		::SelectObject(hdc,hPen);
		//不进行填充
		::SelectObject(hdc,GetStockObject(NULL_BRUSH));	
		
		//擦除
		int nRadius = CDraw::Distance(m_ptBeginPos,m_ptPrePos );
		CDraw::DrawCircle(hdc,m_ptBeginPos,nRadius);

		::SetROP2(hdc,nOldMode);
		::ReleaseDC(hWnd,hdc);		
	}
	//取消画图状态
	OverCurTool(hWnd);
}

void CCircleTool::OnLButtonDown(HWND hWnd,UINT nFlags, POINT ptPos)
{
	CDataBase *pDataBase         = &(g_theApp.m_DataBase);
	CArray<CShape*> *pArrayShape = &(g_theApp.m_DataBase.m_ArrayShape);
	CCircle *pShape              = NULL;

	if(m_eToolState == Init_State)
	{			
		m_eToolState = FirstHit;		
		m_ptBeginPos = m_ptPrePos = ptPos;
	}
	else if(m_eToolState == FirstHit)
	{
		m_eToolState = SecondHit;	
		pShape       = new CCircle;	

		//保存图形样式
		pShape->crColor    = pDataBase->m_Shape.crColor;
		pShape->fnPenStyle = pDataBase->m_Shape.fnPenStyle;
		pShape->nWidth     = pDataBase->m_Shape.nWidth;

		pShape->m_ptFirstPos  = m_ptBeginPos;
		pShape->m_ptSecondPos = ptPos;
		pShape->nRadius       = CDraw::Distance(pShape->m_ptFirstPos,\
			                    pShape->m_ptSecondPos);
		
		//第一点和第二点不重合才保存
		if (pShape->m_ptFirstPos.x != ptPos.x || \
			pShape->m_ptFirstPos.y != ptPos.y)
		{
			//保存至数组
			pArrayShape->Add(pShape);		
		}
		else
		{
			delete pShape;
			pShape = NULL;
		}

		//取消画图状态
		OverCurTool(hWnd);
	}
}